/*
 * 运行环境(此插件在当前环境运行成功)
 * jquery-1.9.1.min.js
 * http://html2canvas.hertzen.com/dist/html2canvas.js
 *
 * 设备兼容(测试过兼容的设备)
 * Chrome
 *
 */
//定义全局变量函数
var localStorage = window.localStorage;
// 当前版本
var version = "1.0.0" ;
//当前页面截图
var screenshot = "";
//traceId 一个阶段产生一个traceId，用于追踪和一个异常相关的所有日志记录
//页面初始化的时候 生成一个traceId
var traceId = getRandomCode(16);
this.set("traceId", traceId);

//要传到后台的业务数据
var data = {};
//反馈成功再次点击奇迹人触发的函数
this.data.callback = "";
//是否使用邮件 默认不使用邮件
this.data.sendEmail = 0;
//当前动作（开发者定义）
this.data.action = "";
// Number当时，用户状态信息（是否可用/禁用）（开发者定义）
this.data.userStatus = "" ;
// Array当时，前用户的角色列表（开发者定义）
this.data.userRoles = "" ;
// Array当时，用户当前所在组，组别权限可能影响结果（开发者定义）
this.data.userGroups = "" ;
// Array当时，许可证，可能过期（开发者定义）
this.data.userLicenses = "" ;
// String进行了什么操作（开发者定义）
this.data.action = "" ;
// String上一个操作
this.data.prevAction = "" ;
// Object当前界面的state、data（开发者定义）
this.data.data = "" ;
// Array上游api给了什么数据
this.data.dataSources = "" ;
// Object提交了什么数据
this.data.dataSend = "" ;
// HTMLElement用户操作的DOM元素
this.data.targetElement = "" ;
// Array该DOM元素的节点路径
this.data.targetDOMPath = "" ;
// Object该元素的自定义样式表
this.data.targetCSS = "" ;
// Object该元素当前的属性及值
this.data.targetAttrs = "" ;
// String错误类型
this.data.errorType = "" ;
// String异常级别（开发者定义）
this.data.errorLevel = "" ;
// String错误stack信息
this.data.errorStack = "" ;
// String出错文件
this.data.errorFilename = "" ;
// Number出错行
this.data.errorLineNo = "" ;
// Number出错列位置
this.data.errorColNo = "" ;
// String错误描述（开发者定义）
this.data.errorMessage = "" ;
// String事件类型
this.data.eventType = "" ;
// Number事件x轴坐标
this.data.pageX = "" ;
// Number事件y轴坐标
this.data.pageY = "" ;
// Number事件x轴坐标
this.data.screenX = "" ;
// Number事件y轴坐标
this.data.screenY = "" ;
// String触发事件的键
this.data.eventKey = "" ;
// String设备描述
this.data.device = "" ;

// -----------------------小图标滚动开始-----------------------
var rDrag = {
 o:null,
 init:function(o){
 o.onmousedown = this.start;
 },
 start:function(e){
 var o;
 e = rDrag.fixEvent(e);
 e.preventDefault && e.preventDefault();
 rDrag.o = o = this;
 o.x = e.clientX - rDrag.o.offsetLeft;
 o.y = e.clientY - rDrag.o.offsetTop;
 document.onmousemove = rDrag.move;
 document.onmouseup = rDrag.end;
 },
 move:function(e){
 e = rDrag.fixEvent(e);
 var oLeft,oTop;
 oLeft = e.clientX - rDrag.o.x;
 oTop = e.clientY - rDrag.o.y;
 rDrag.o.style.left = oLeft + 'px';
 rDrag.o.style.top = oTop + 'px';
 },
 end:function(e){
 e = rDrag.fixEvent(e);
 rDrag.o = document.onmousemove = document.onmouseup = null;
 },
 fixEvent: function(e){
 if (!e) {
 e = window.event;
 e.target = e.srcElement;
 e.layerX = e.offsetX;
 e.layerY = e.offsetY;
 }
 return e;
 }
}

var isdrag = true;
var tempX, x, tempY, y;

function dragStart(e) {
 isdrag = true;
 tempX = parseInt($("#h5Drag").css("left") + 0);
 tempY = parseInt($("#h5Drag").css("top") + 0);
 x = e.touches[0].pageX;
 y = e.touches[0].pageY;
}
// -----------------------小图标滚动结束-----------------------

//上传异常日志
function buildData(){
 var json = {};

	//-----------------------需要用户填充的数据-----------------------
    //当前应用/系统标志
    json.appId	= $("#appId").val();
    // String一个界面产生一个pageId
    json.pageName = $("#pageName").val();
	//当前系统用户ID
    json.userId	 = $("#userId").val();
    if(json.appId == "" || json.appId == undefined){
    	json.appId = this.data.appId;
    }
    if(json.userId == "" || json.userId == undefined){
    	json.userId = this.data.userId;
    }


 //当前插件版本
 json.version	= this.version	 ;

 // String一个阶段产生一个traceId，用于追踪和一个异常相关的所有日志记录
 json.traceId		= get("traceId") ;
 // String这条log的唯一标识码，相当于logId，但它是根据当前日志记录的具体内容而生成的
 json.hash			= this.data.hash			 ;
 json.userStatus	= this.data.userStatus	 ;
 json.userRoles		= this.data.userRoles	 ;
 json.userGroups	= this.data.userGroups	 ;
 json.userLicenses	= this.data.userLicenses	 ;
 json.action		= this.data.action		 ;
 json.prevAction	= this.data.prevAction	 ;
 json.dataSources	= this.data.dataSources	 ;
 json.dataSend		= this.data.dataSend		 ;
 json.targetElement= this.data.targetElement ;
 json.targetDOMPath= this.data.targetDOMPath ;
 json.targetCSS		= this.data.targetCSS	 ;
 json.targetAttrs	= this.data.targetAttrs	 ;
 json.errorType		= this.data.errorType	 ;
 json.errorLevel	= this.data.errorLevel	 ;
 json.errorStack	= this.data.errorStack	 ;
 json.errorFilename= this.data.errorFilename ;
 json.errorLineNo	= this.data.errorLineNo	 ;
 json.errorColNo	= this.data.errorColNo	 ;
 json.errorMessage	= this.data.errorMessage	 ;
 json.eventType		= this.data.eventType	 ;
 json.pageX			= this.data.pageX		 ;
 json.pageY			= this.data.pageY		 ;
 json.screenX		= this.data.screenX		 ;
 json.screenY		= this.data.screenY		 ;
 json.eventKey		= this.data.eventKey		 ;
 json.device		= this.data.device		 ;
 //是否发送邮件
 json.sendEmail = this.data.sendEmail;


	//-----------------------通过函数计算抓取的信息-----------------------
 // String操作系统描述
 json.system = detectOS() ;
	// Number时间戳
 json.errorTimeStamp = new Date().getTime() ;
	// Number当前日志产生的时间（保存时刻）（后台自动填充数据库时间）
 json.time = new Date().getTime() ;
 // String所在路径，URL
 json.path = window.location.href ;
	//屏幕截图
 json.screenshot = this.screenshot;


	//-----------------------系统自动抓取的信息-----------------------
 // Number页面宽度
 json.pageW = document.body.scrollWidth ;
 // Number页面高度
 json.pageH = document.body.scrollHeight ;
 // Number屏幕宽度
 json.screenW = window.screen.width ;
 // Number屏幕高度
 json.screenH = window.screen.height ;
	// String网络环境描述
 json.network = navigator.onLine ;
 // String客户端描述
 json.userAgent = navigator.userAgent ;
	// String应用名称
	json.appName = navigator.appName;
	// String应用版本
 json.appVersion	= navigator.appVersion;
	// String上一个路径，来源URL
 json.referer = document.referrer ;
    //当前页面名称
    json.pageName = document.title;

 return json;
}

function dragMove(e) {
 if (isdrag) {
 var curX = tempX + e.touches[0].pageX - x;
 var curY = tempY + e.touches[0].pageY - y;
 //边界判断
 curX = curX < 0 ? 0 : curX;
 curY = curY < 0 ? 0 : curY;
 curX = curX < window.screen.width - 102 ? curX : window.screen.width - 102;
 curY = curY < window.screen.height - 102 ? curY : window.screen.height - 102;
 $("#h5Drag").css({
 "left": curX,
 "top": curY
 });
 //禁止浏览器默认事件
 e.preventDefault();
 }
}

function dragEnd() {
 isdrag = false;
}

//程序入口
function exception(){
	//hash 这条log的唯一标识码，相当于logId，但它是根据当前日志记录的具体内容而生成的
	var hash = getRandomCode(11) + new Date().getTime();
	data.hash = hash;
	//截屏
	this.screenShot();
	//显示页面机器人
	this.showRobot();
}

//发送数据
function recordData(){
	//获取异常页面截图
	//生成异常反馈数据
	var data = this.buildData();
	//上传异常数据
	$.ajax({
		type: 'POST',
		url: $("#apiUrl").val(),
		data: JSON.stringify(data),
		contentType:"application/json; charset=utf-8",
		dataType: "application/json",
		xhrFields: {
            withCredentials: true // 设置运行跨域操作
        },
		success: function(result){
			console.log(result);
		},
		error: function(result){
			console.log(result);
		}
	});

	//数据上传完毕，改变机器人的样式
    changeRobot();

 //window.location.href = "/admin"
}

//展示机器人
function showRobot(){
	//判断当前浏览器是PC还是移动
	var isPC= this.isPC();
	var wrap=document.createElement("div");
	//wrap.innerHTML = "反馈问题";
	if(isPC){
		wrap.style = "position: fixed;width: 150px;height: 150px;background: #0dc2b3;color: #fff;text-align: center;border-radius: 50%;font-size: 25px;line-height: 150px;";
		var divId = document.createAttribute("id"); //创建属性
		divId.value = 'pcDrag'; //设置属性值
		wrap.setAttributeNode(divId); //给div添加属性
	} else {
		wrap.style = "position: fixed;width: 100px;height: 100px;background: #0dc2b3;color: #fff;text-align: center;border-radius: 50%;font-size: 20px;line-height: 100px;background-image:url()";
		var divId = document.createAttribute("id"); //创建属性
		divId.value = 'h5Drag'; //设置属性值
		wrap.setAttributeNode(divId); //给div添加属性
	}

	var clickEvent = document.createAttribute("onclick"); //创建属性
	clickEvent.value = 'recordData()'; //设置属性值
	wrap.setAttributeNode(clickEvent); //给div添加属性

	var first = document.body.firstChild;//得到页面的第一个元素
	document.body.insertBefore(wrap,first);

	if(isPC){
		var obj = document.getElementById('pcDrag');
		rDrag.init(obj);
	} else {
		document.getElementById("h5Drag").addEventListener("touchstart", dragStart);
		document.getElementById("h5Drag").addEventListener("touchmove", dragMove);
		document.getElementById("h5Drag").addEventListener("touchend", dragEnd);
	}
}

//切换另外一个机器人
function changeRobot(){
	var isPC = this.isPC();
	if(isPC){
	    $("#pcDrag").html("反馈成功");
	    //清空原有的函数，赋值新的函数
       	$("#pcDrag").attr('onclick', '').click(function(){
       	    alert("已经反馈成功，您还可以拨打95500致电人工客服");
       	});
	} else {
	    // $("#h5Drag").html("反馈成功");
	    $("#h5Drag").css("background-image","url()");
	   	//清空原有的函数，赋值新的函数

	   	//回调函数不为空
	   	if(this.data.callback != ""){
            $("#h5Drag").attr('onclick', this.data.callback);
	   	} else {
	   	    //回调函数为空  执行默认操作
	   	    $("#h5Drag").attr('onclick', '').click(function(){
                alert("已经反馈成功，您还可以拨打95500致电人工客服");
            });
	   	}

	}

}

// 借助html2canvas工具类实现截屏，并返回截屏产生的图片base64码
function screenShot() {
	this.screenshot = "";

	/*图片跨域及截图模糊处理*/
    let screenContent = document.body,//需要截图的包裹的（原生的）DOM 对象
        canvas = document.createElement("canvas"), //创建一个canvas节点
        scale = 1; //定义任意放大倍数 支持小数
//    canvas.width = width * scale; //定义canvas 宽度 * 缩放
//    canvas.height = height * scale; //定义canvas高度 *缩放
//    canvas.style.width = screenContent.clientWidth * scale + "px";
//    canvas.style.height = screenContent.clientHeight * scale + "px";
    canvas.getContext("2d").scale(scale, scale); //获取context,设置scale
//    console.log("width:" + width);
//    console.log("height:" + height);
//    let opts = {
//        scale: scale, // 添加的scale 参数
//        canvas: canvas, //自定义 canvas
//        logging: false, //日志开关，便于查看html2canvas的内部执行流程
//        // proxy: "http://localhost:31001/proxy/canvas",
//        useCORS: true, // 【重要】开启跨域配置
//        backgroundColor: "transparent",
//        allowTaint: true,
//        foreignObjectRendering: true, // 最主要是这句话，官方给出解释是否在浏览器支持的情况下使用ForeignObject渲染，
//        async: false, // 同步执行
//        x: 0, //裁剪画布x坐标 (导出的时候位置不太对，使用这个属性完美解决)
//        y: 0,
//        background: '#FFFFFF' // 默认为黑色，将 background 为其他颜色
//    };
//
//    官网demo
//    html2canvas(document.body).then(function(canvas) {
//        document.body.appendChild(canvas);
//    });
	html2canvas(document.body).then(function(canvas) {
		var dataUrl = canvas.toDataURL();// 导出图片
		this.screenshot = dataUrl;
		console.log("截图生成的图片为：" + dataUrl);
		// canvas为转换后的Canvas对象
        //let oImg = new Image();
        //oImg.src = dataUrl;
        //document.body.appendChild(oImg);  // 将生成的图片添加到body
	});
	return screenshot;
}

function appendImg(dataUrl){
	var wrap=document.createElement("img");
	var imgSrc = document.createAttribute("src"); //创建属性
	imgSrc.value = dataUrl; //设置属性值
	wrap.setAttributeNode(imgSrc); //给div添加属性

	var imgStyle = document.createAttribute("style"); //创建属性
	imgStyle.value = "width: 100%;height: 100%;"; //设置属性值
	wrap.setAttributeNode(imgStyle); //给div添加属性

	var last = document.body.lastChild;//得到页面的第一个元素
	document.body.insertBefore(wrap,last);
}


function detectOS() {
	var userAgent = navigator.userAgent;
	var isWin = (navigator.platform == "Win32") || (navigator.platform == "Windows");
	var isMac = (navigator.platform == "Mac68K") || (navigator.platform == "MacPPC") || (navigator.platform == "Macintosh") || (navigator.platform == "MacIntel");
	if (isMac) return "Mac";
		var isUnix = (navigator.platform == "X11") && !isWin && !isMac;
	if (isUnix) return "Unix";
		var isLinux = (String(navigator.platform).indexOf("Linux") > -1);
	if (isLinux) return "Linux";
	if (isWin) {
		var isWin2K = userAgent.indexOf("Windows NT 5.0") > -1 || userAgent.indexOf("Windows 2000") > -1;
		if (isWin2K) return "Win2000";
			var isWinXP = userAgent.indexOf("Windows NT 5.1") > -1 || userAgent.indexOf("Windows XP") > -1;
		if (isWinXP) return "WinXP";
			var isWin2003 = userAgent.indexOf("Windows NT 5.2") > -1 || userAgent.indexOf("Windows 2003") > -1;
		if (isWin2003) return "Win2003";
			var isWinVista= userAgent.indexOf("Windows NT 6.0") > -1 || userAgent.indexOf("Windows Vista") > -1;
		if (isWinVista) return "WinVista";
			var isWin7 = userAgent.indexOf("Windows NT 6.1") > -1 || userAgent.indexOf("Windows 7") > -1;
		if (isWin7) return "Win7";
	}
	return "other";
}

function isPC() {
	var userAgentInfo = navigator.userAgent;
	var Agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"];
	var flag = true;
	for (var v = 0; v < Agents.length; v++) {
		if (userAgentInfo.indexOf(Agents[v]) > 0) {
			flag = false;
			break;
		}
	}
	return flag;
}


//定义全局变量u
//设置缓存
function set(key, value) {
	var v = value;
	//是对象转成JSON，不是直接作为值存入内存
	if (typeof v == 'object') {
		v = JSON.stringify(v);
		v = 'obj-' + v;
	} else {
		v = 'str-' + v;
	}
	var localStorage = window.localStorage;
	if (localStorage ) {
		localStorage .setItem(key, v);
	}
}
//获取缓存
function get(key) {
	var localStorage = window.localStorage;
	if (localStorage) {
		var v = localStorage.getItem(key);
		if (!v) {
			return;
		}
		if (v.indexOf('obj-') === 0) {
			v = v.slice(4);
			return JSON.parse(v);
		} else if (v.indexOf('str-') === 0) {
			return v.slice(4);
		}
	}
}

//获取一个指定长度的随机数
function getRandomCode(length) {
	if (length > 0) {
		var data = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"];
		var nums = "";
		for (var i = 0; i < length; i++) {
			var r = parseInt(Math.random() * 61);
			nums += data[r];
		}
		return nums;
	} else {
		return false;
	}
}